{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Scikit-Learn中SVM(本节解决分类问题)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "> SVM处理数据之前也需要先标准化，否则当数据在不同维度上尺度不同时，会影响决策边界的判定"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn import datasets\n",
    "iris = datasets.load_iris()\n",
    "\n",
    "X = iris.data\n",
    "y = iris.target\n",
    "\n",
    "X = X[y<2, :2] # 仅取前两个特征，方便可视化\n",
    "y = y[y<2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(X[y==0, 0], X[y==0, 1], color='red')\n",
    "plt.scatter(X[y==1, 0], X[y==1, 1], color='blue')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 使用SVM对数据进行分类"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1.对数据进行标准化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "standardScaler = StandardScaler()\n",
    "standardScaler.fit(X)\n",
    "X_standard = standardScaler.transform(X)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2.使用SVM解决分类问题\n",
    "+ C越大容错空间越小，越接近Hard-Margin SVM\n",
    "+ C越小容错空间越大，越接近Soft-Margin SVM"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.svm import LinearSVC # LinearSVC C代表Classify即分类问题"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LinearSVC(C=1000000000.0, class_weight=None, dual=True, fit_intercept=True,\n",
       "          intercept_scaling=1, loss='squared_hinge', max_iter=1000,\n",
       "          multi_class='ovr', penalty='l2', random_state=None, tol=0.0001,\n",
       "          verbose=0)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "svc_hard = LinearSVC(C=1e9) # C很大，几乎没容错空间\n",
    "svc_hard.fit(X_standard, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LinearSVC(C=0.01, class_weight=None, dual=True, fit_intercept=True,\n",
       "          intercept_scaling=1, loss='squared_hinge', max_iter=1000,\n",
       "          multi_class='ovr', penalty='l2', random_state=None, tol=0.0001,\n",
       "          verbose=0)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "svc_soft = LinearSVC(C=0.01) # C很小，容错空间很大\n",
    "svc_soft.fit(X_standard, y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.绘图查看决策边界"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_decision_boundary(model, axis):\n",
    "    \"\"\"\n",
    "    根据模型绘制决策边界\n",
    "    \"\"\"\n",
    "    x0, x1 = np.meshgrid(\n",
    "        np.linspace(axis[0], axis[1], int((axis[1]-axis[0])*100)).reshape(-1, 1),\n",
    "        np.linspace(axis[2], axis[3], int((axis[3]-axis[2])*100)).reshape(-1, 1),\n",
    "    )\n",
    "    X_new = np.c_[x0.ravel(), x1.ravel()]\n",
    "\n",
    "    y_predict = model.predict(X_new)\n",
    "    zz = y_predict.reshape(x0.shape)\n",
    "\n",
    "    from matplotlib.colors import ListedColormap\n",
    "    custom_cmap = ListedColormap(['#EF9A9A','#FFF59D','#90CAF9'])\n",
    "    \n",
    "    plt.contourf(x0, x1, zz, linewidth=5, cmap=custom_cmap)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\ProgramData\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:17: UserWarning: The following kwargs were not used by contour: 'linewidth'\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXYAAAD8CAYAAABjAo9vAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAYgElEQVR4nO3df2yc9X0H8Pcn5yyxwgXLI1kyO1U6lUVUJCRaFG1iGtuabmlUFSpSqZ07onaSNWnLQF0F6yxRlSlSV6SoVVZpjQYsSLRdWYpatZkG0Wg70CAEBAluIGKVIEnDEmpBLtSh2P7sD9+Fi3P289w9n+f763m/JEv4cv7e5znMO8fzvO97oqogIqJ0LPI9ABER2WKwExElhsFORJQYBjsRUWIY7EREiWGwExElpnCwi8hSETksIi+IyLiIfMliMCIi6o0U7bGLiABYpqoXRGQxgCcA3K6qT1kMSERE3ekruoDO/s1wofnt4uYX3/VERORJ4WAHABGpAXgWwAcAfF1Vn+5wn1EAowCwbMmS37l21SqLhyaiSP2i/9d9jxCdky8994aqrsi6X+FTMZctJjIA4BEAu1T1xfnut2ntWn18bMzscYkoLvs37vQ9QpTu2LLkWVXdnHU/01aMqr4J4EcAtlmuS0TpYKiXz6IVs6L5Sh0i0g9gK4CXiq5LROlhqLthcY59NYD9zfPsiwB8R1V/YLAuESWEoe6ORSvmKIBNBrMQUaIY6m7xnadEVCqGunsmdUciutzBRj/2TtTx+lQNq/qmsWuwge31Sd9jOcdQ94PBTmTsYKMf95y7Ghd19n+Iz0z14Z5zVwNApcKdoe4PT8UQGds7Ub8U6i0XdRH2TtQ9TeQeQ90vBjuRsdenal3dnhqGun8MdiJjq/qmu7o9JQz1MDDYiYztGmxgqcxcdttSmcGuwYanidxgqIeDF0+JjLUukFapFcNQDwuDnagE2+uTSQd5O4Z6eHgqhoh6NjBSjQvCseErdiLqyf6NO4Fx31NQJ3zFTkRd4+mXsDHYiagrPP0SPgY7EeU2MFLD18Y/7XsMysBgJ6JcGOrxYLATUSaGelzYiiGag1vuXomhHhcGO1Ebbrl7Ob5SjxNPxRC14Za7l2Oox4nBTtSm6lvutmNXPV4MdqI2Vd5ytx1DPW4MdqI2Vd1ytx1DPX68eErUpopb7rZjqKeBwU40R5W23G3HUE8Hg52iwX55eRjqaWGwUxTYLy8PQz09vHhKUWC/vBwM9TQVDnYRWSMij4vIcREZF5HbLQYjasd+uT2GerosXrFPAfhbVb0OwO8C+CsR+aDBukSXsF9ui6GetsLBrqpnVPW55j83ABwHMFR0XaJ27JfbYainz/TiqYisBbAJwNOW6xJVvV9uhaFeDWbBLiJXATgA4A5VPd/hz0cBjALA8OCg1cNShVS1X26FoV4dJq0YEVmM2VB/SFW/2+k+qrpPVTer6uZr6mwyEB1s9OMjr67Epv9djY+8uhIHG/2lPRZDvVoKv2IXEQFwH4Djqrqn+EhE6XPZy2eoV4/FK/YbAfw5gD8WkeebX9sN1iVKlqte/sAI66BVVPgVu6o+AUAMZiGqDBe9/P0bdwLjZstRRPjOUyIPyu7l85V6tTHYiTwos5fPzyklbgJG5EFZvXyGOgEMdqqY3WeX40BjGWYw+7+rt9bfxtjKK9524UQZvXyGOgEMdqqQ3WeX4+HGMrSu9c8Aze/hLdwtsdZILTzHTpVxoC3U3yPN2+PGUKd2DHaqjJkub48FQ53mYrBTZcz3yx7zfwQMdeok5t9poq7cWn8bgM65VZu3x4ehTvPhxVOqjNYF0lBaMUUw1GkhDHaqlLGV56MM8nYMdcrCYKcgjJ4axOF3llz6fsuSd7BveMLjRMUcbPSX8qEgDHXKg+fYybv3Ql0ufR1+ZwlGT8X5gSytLXnPTPVBIZe25C263zpDnfJisJN374V6O7nsFXxMytiSl6FO3WCwExmz3pKXoU7dYrATGbPckpehTr1gsJN3W5a8g0798tnb42O1JS9DnXrFYCfv9g1PtIX77FfMrZjt9UncveItrO6bgkCxum8Kd694q6tWDEOdimDdkYJwy9WTODnRd6keeMvV3VcD81QMy6ohzlVkS16GOhXFYCfvWvXAVpOkVQ8EkDsc86xh8ThlY6iTBZ6KIe8s6oF51iijhmiJoU5WGOzknUU9MM8a1jVESwx1ssRgJ+8s6oF51rCsIVoaGPH/FwulhcFO3lnUA/OsYVVDtMQPn6Yy8OIpede6cFmkrZJnDYvHsbR/405g3MtDU+IY7BSEIvXAbtaweBwLAyM1hjqVhsGeKFd97ZC647Hg6RcqG4M9Qa762ql0x11iqJMLJhdPReR+ETkrIi9arEfFuOprp9Add42hTi5YtWL+FcA2o7WoIFd97di7466xq06umAS7qv4EQJw7NiXIVV875u64awx1cslZj11ERkXkiIgceaPhrzdcBa762rF2x11jqJNrzi6equo+APsAYNPatXM33yZDrvraMXbHXWOokw9sxSTKVV87pu64awx18oXBTqXbfXY5DjSWYQaz5/5urb+NsZXnu75PSN38LAx18smq7vgtAP8DYJ2InBKRv7BYl+K3++xyPNxYhhkIAMEMBA83lmH32eVd3afVhz8z1QeFXOrDH2z0m85r8TgMdfLNqhXzKVVdraqLVXVYVe+zWJfid6CxDIDMuVWat+e/T0jd/IUw1CkE3N2RSjWT4/Y89wmpmz8fhjqFgsFOpZrvF2xRl/cJqZvfCUOdQsJgp1LdWn8bwNx2qzZvz3+fkLr5czHUKTRsxVCpWs2WhRovee4TUje/HUOdQsRgT5RVNTBPDdHCpv538cTkNF6fquE3+qaxqf9d88cA8h1P3t59KKH+26f/HTe+vBv1ydNo9A/hyXVjODG0w/dY5BGDPUFWW+W2aoitxsoM0PweucM9zxqutv+1OJ6WkEJ967HPYfH07HOwfPIUth77HAAw3CuM59gTZFUNzFNDtFjD1fa/FscDhPXh0ze+vPtSqLcsnp7EjS/v9jQRhYCv2BNkVQ3MU0O0WMPV9r8WxxPa55TWJ093dTtVA1+xJ8iqGpinhmixhqvtf4seTyinX9o1+oe6up2qgcGeIKtqYJ4aosUarrb/LXI8IZ1+affkujG8W7t8u4N3a/14ct2Yp4koBDwVkyCramCeGqLFGq62/+31eEL+nNLWBVK2YqidqLrfGn3T2rX6+BhfUVD4Qjz9QtV1x5Ylz6rq5qz78RU7lS5Pp97VlrzUO/bl48Fgp1K56qiXga/W38O+fFx48ZRK5aqjbmlgpMZQn4N9+bgw2KlUrjrqlkK9UOoT+/JxYbBTqVx11K3wlXpn7MvHhcFOpXLVUbfAUJ8f+/Jx4cVTKpWrjnpRDPWFsS8fFwZ7gCyqf3nWcLUlbx55t8otQ8ihHlLF8MTQjszHDmleC7EeD4M9MBbVvzxrWG5hW3QWn0IP9ZgqhrHNmyXm4+E59sBYVP/yrGG1ha3FLL6EHOpAfBXD2ObNEvPxMNgDY1H9y7OGxRa2VrP4EHqoA/FVDGObN0vMx8NgD4xF9S/PGhZb8lrN4loMoQ7EVzGMbd4sMR8Pgz0wFtW/PGtYbMlrNYtLsYQ6EF/FMLZ5s8R8PLx4GhiL6l+eNSy25LWaxZWYQh2Ir2IY27xZYj4ebttLlRBbqBN14nTbXhHZBuBrAGoA/kVVv2yxLvXOahvcrHVC6sLPh6GenpuO3YkNJx+E6DRUaji65jb8eP1Xuloj1o56HoWDXURqAL4O4MMATgF4RkS+r6o/Lbo29caqO561jqsufBEM9fTcdOxO3PDaA5fKuqLTuOG1BwAgd7jH3FHPw+Li6RYAr6jqz1T1VwC+DeBmg3WpR1bd8ax1XHXhe8VQT9OGkw92+K2bvT2vmDvqeVgE+xCAk23fn2redhkRGRWRIyJy5I2Gn0ZEVVh1x7PWcdWF7wVDPV2inauy893eScwd9Twsgn3uX57AlT06qOo+Vd2sqpuvqft/12HKrLrjWeu46sJ3i6GeNpXOLzjmu72TmDvqeVj8N3gKwJq274cB/NxgXeqRVXc8ax1XXfhuMNTTd3TNbR1+62ZvzyvmjnoeFq2YZwBcKyLvB3AawCcB/JnButQjq+541jquuvB5DYzUgHEvD00OtS6QFmnFxNxRz8Okxy4i2wF8FbN1x/tVdcErEOyxk7WBkRo/0o6S57THrqoHARy0WCt1efrlVh10C1k99RCOp5tQt+ouZ/WorR7HYp3Y+tp55o3tmFzjlgIO5emXh7R/eVZPPZTj6SbULbrLWT1qq8exWCe2vnaeeWM7Jh98FxgqJU+/PKT9y7N66iEcTzcXS626y1k9aqvHsVgntr52nnljOyYfGOwO5emXh7R/eVZP3ffxdNuAseouZ/WorR7HYp3Y+tp55o3tmHxgsDuUp18e0v7lWT11n8fTS63Rqruc1aO2ehyLdWLra+eZN7Zj8oHB7lCefnlI+5dn9dR9HU+vXXWr7nJWj9rqcSzWia2vnWfe2I7JB148dShPvzyk/cuzeuo+jqfIG5CsustZPWqrx7FYJ7a+dp55YzsmHxjsjm2vT3qrLvZibOX5Bd9wlOd4rI7Z4l2lJ4Z2mATAmcEt+K1zj6E+eRoXlq7GmcEthdfsJM+8IVUiXdUQrf49porBHpiQ6o4hCWmrgKy6ncs6nsUsrGemh+fYAxNS3TEUIYU6kF23c1nHs5iF9cz0MNgDE1LdMQShhTqQXbdzWcezmIX1zPQw2AMTUt3RtxBDHciu27ms41nMwnpmehjsgQmp7uhTqKEOZNftXNbxLGZhPTM9vHgamJDqjr6EHOpAdt3OZR3PYhbWM9Njsm1vt7htL80n9FAn8snptr1EFlIK9axtfas6i6uee9W39WWwUxBSC/WFtvWt6iyuOurswvPiKQUgpVAHsrf1reosrjrq7MIz2Mmz1EIdyN7W16WQZnHVUWcXnsFOHqUY6kD2tr4uhTSLq446u/AMdvJkYCTdd9Jmbetb1VlcddTZhefFU/Jg/8adwLjvKcqTta1vVWdx1VFnF549dnKsyOmXkCpsFrNY1RBDel6oXOyxU3AGRmo9v1IPqcJmMYtVDTGk54XCwXPs5MTASA1fG/90zz8fUoXNYharGmJIzwuFg8FOThQJdSCsCpvFLFY1xJCeFwoHg51KZ1FrDKnCZjGLVQ0xpOeFwsFgp1JZddVDqrBZzGJVQwzpeaFwFAp2EfmEiIyLyIyIZF6ppWqxfAPSiaEdOLR+D873D0MhON8/jEPr93i5QGgxy4/XfwUvvO8zmJEaFMCM1PDC+z7TdSsmpOeFwlGo7igi1wGYAfANAJ9X1SN5fo51x/Sl+q5SIp+c1B1V9TgAiMy9vk9VFnuoW/TC86zB/jmVxVmPXURGAYwCwPDgoKuHJcdSCPWivfA8a7B/TmXKPMcuIodE5MUOXzd380Cquk9VN6vq5mvq9d4npmDFHuqATS88zxrsn1OZMl+xq+pWF4NQ3FIIdcCmF55nDfbPqUysO1JhqYQ6YNMLz7MG++dUpqJ1x4+LyCkAvwfghyLynzZjUSxSCnXApheeZw32z6lMRVsxjwB4xGgWikxqoQ7YbPmaZw1uLUtl4ra91JMUQ50odNy2l0pTRqiH1OlmB72zKh5zrBjs1JWyQj2UTjc76J1V8ZhjxlYM5VbW6ZeQOt3soHdWxWOOGYOdcinznHpInW520Dur4jHHjMFOmcq+UBpSp5sd9M6qeMwxY7DTgly0X0LqdLOD3lkVjzlmvHhK8yry4dPdCKnTzQ56Z1U85pgx2KmjvB8+bVWBOzG0I5iQWD1xGFddPANAcdXFM1g9cfiK2UKa15UqHnOsGOx0hf0bd+Z6pZ5iBe6mY3fihtceQOsTBkSnccNrDwBA159uROQLz7FTz1KswG04+SDmfmyMNG8nigWDnS4ZGKl1dbE0xQqc6HRXtxOFiMFOAPKfU2+XYgVOpdbV7UQhYrATAHQd6kCaFbija27D3G3xtHk7USx48ZR67qqnWIFrXSDdcPJBiE5DpYaja27jhVOKCrftrThuv0sUD27bm7CDjX7snajj9akaVvVNY9dgA9vrk9k/OIerUI9tu9fY5nWFz0s8GOyROdjoxz3nrsZFnb08cmaqD/ecuxoAugp3l6EeU9c9tnld4fMSF148jczeifqlUG+5qIuwd6Keew2Xp19i67rHNq8rfF7iwmCPzOtTnWt3890+l+tz6rF13WOb1xU+L3FhsEdmVV/nN8rMd3s7HxdKY+u6xzavK3xe4sJgj8yuwQaWysxlty2VGewabCz4c77aL7F13WOb1xU+L3HhxdPItC6QdtOK8VlpjK3rHtu8rvB5iQt77IljTz19FjVEVhnjwB47MdQrwKKGyCpjeniOPVEM9WqwqCGyypgeBnuCGOrVYVFDZJUxPYWCXUTuFZGXROSoiDwiIgNWg1FvGOrVYlFDZJUxPUVfsT8G4HpV3QDgBIAvFB+JesVQrx6LGiKrjOkpFOyq+qiqTjW/fQrAcPGRqBcM9Wo6MbQDh9bvwfn+YSgE5/uHcWj9nq4uelqsQWGxbMV8FsC/Ga5HOTHUq+3E0I7CIWyxBoUjM9hF5BCAVR3+aExVv9e8zxiAKQAPLbDOKIBRABgeHOxpWLrSwEgNGPc9BRGFJDPYVXXrQn8uIjsBfBTAh3SBdzup6j4A+4DZNyh1OSd10MvnlBJR+gqdihGRbQDuAnCTqv7SZiTKY//GnXylTkQdFW3F/BOAOoDHROR5Eflng5mIiKiAQq/YVfUDVoNQfrxYSkQL4TtPIzIwUmOoE1EmBntEeKGUiPJgsEeCr9SJKC9u2xuB2EOde30TucVgD1wKoc69vonc4qmYgMUe6gD3+ibygcEeqBRCHeBe30Q+MNgDlEqoA9zrm8gHBntgUgp1gHt9E/nAi6cBSS3UgfcukLIVQ+QOgz0QKYZ6C/f6JnKLp2ICkHKoE5F7DHbPGOpEZI3B7hFDnYjKwGD3hKFORGVhsHvAUCeiMjHYHWOoE1HZGOwOMdSJyAUGuyMMdSJyhcHuAEOdiFxisJdsYKTmewQiqhgGe4kGRmr8nFIico7BXiKGOhH5wGAvCc+rE5EvDPYSMNSJyCcGuzGGOhH5xmA3xFAnohAw2I0w1IkoFIWCXUT+QUSOisjzIvKoiPym1WAxYagTUUiKvmK/V1U3qOpGAD8AcLfBTFFhqBNRaAoFu6qeb/t2GQAtNk5cGOpEFCJRLZbFIrIbwG0A3gLwR6p6bp77jQIYbX57PYAXCz1w2K4B8IbvIUqU8vGlfGwAjy9261S1nnWnzGAXkUMAVnX4ozFV/V7b/b4AYKmqfjHzQUWOqOrmrPvFiscXr5SPDeDxxS7v8fVl3UFVt+Z8zG8C+CGAzGAnIqLyFG3FXNv27ccAvFRsHCIiKirzFXuGL4vIOgAzAF4F8Jc5f25fwccNHY8vXikfG8Dji12u4yt88ZSIiMLCd54SESWGwU5ElBhvwZ7ydgQicq+IvNQ8vkdEZMD3TJZE5BMiMi4iMyKSTLVMRLaJyMsi8oqI/J3veSyJyP0iclZEknz/iIisEZHHReR483fzdt8zWRGRpSJyWEReaB7blzJ/xtc5dhFZ3nrnqoj8DYAPqmrei69BE5E/AfBfqjolIv8IAKp6l+exzIjIdZi9YP4NAJ9X1SOeRypMRGoATgD4MIBTAJ4B8ClV/anXwYyIyB8AuADgQVW93vc81kRkNYDVqvqciNQBPAvglhT+/YmIAFimqhdEZDGAJwDcrqpPzfcz3l6xp7wdgao+qqpTzW+fAjDscx5rqnpcVV/2PYexLQBeUdWfqeqvAHwbwM2eZzKjqj8BMOF7jrKo6hlVfa75zw0AxwEM+Z3Khs660Px2cfNrwbz0eo5dRHaLyEkAI0h3A7HPAvgP30NQpiEAJ9u+P4VEgqFqRGQtgE0AnvY7iR0RqYnI8wDOAnhMVRc8tlKDXUQOiciLHb5uBgBVHVPVNQAeAvDXZc5iLevYmvcZAzCF2eOLSp7jS4x0uC2Z/4usChG5CsABAHfMOSsQNVWdbu6iOwxgi4gseDqt6BuUsoZJdjuCrGMTkZ0APgrgQxrhmwW6+HeXilMA1rR9Pwzg555moR40zz8fAPCQqn7X9zxlUNU3ReRHALZhgY0UfbZikt2OQES2AbgLwMdU9Ze+56FcngFwrYi8X0R+DcAnAXzf80yUU/MC430AjqvqHt/zWBKRFa1mnYj0A9iKjLz02Yo5AOCy7QhU9bSXYYyJyCsAlgD4RfOmp1Jp/ACAiHwcwF4AKwC8CeB5Vf1Tv1MVJyLbAXwVQA3A/aq62/NIZkTkWwD+ELPb2v4fgC+q6n1ehzIkIr8P4L8BHMNspgDA36vqQX9T2RCRDQD2Y/b3chGA76jqPQv+TIRnCYiIaAF85ykRUWIY7EREiWGwExElhsFORJQYBjsRUWIY7EREiWGwExEl5v8BbTQ7QBTOA+oAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_decision_boundary(svc_hard, axis=[-3, 3, -3, 3])\n",
    "plt.scatter(X_standard[y==0, 0], X_standard[y==0, 1])\n",
    "plt.scatter(X_standard[y==1, 0], X_standard[y==1, 1])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\ProgramData\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:17: UserWarning: The following kwargs were not used by contour: 'linewidth'\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXYAAAD8CAYAAABjAo9vAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAYWUlEQVR4nO3dYYxc1XnG8ef12rVXZg3dBmLXduVUEEREja0iq5WrkjZui1AaEgFSUlqs5oMVqaWgNEqarpI0VFaTRooSkXyIVaBGokmTOChRQ9uASpqARMAgAgYHi0YqXsepoRZlIWuC128/7Iy9Xs/uvbP33HvPOff/kywx1+Mz54yXl8O5z7xj7i4AQD6WtT0BAEBYFHYAyAyFHQAyQ2EHgMxQ2AEgMxR2AMhM5cJuZqvM7FEz+6GZPWNmnwwxMQDA0ljVHLuZmaTV7v6qma2Q9JCkW9z9kRATBAAMZ3nVAXz2vwyv9h6u6P3iU08A0JLKhV2SzGxE0uOSLpb0RXf/wYDn7JK0S5JWr1z565esXRvipQEgSSPj0rHpXxrqzxz+0RMvufuFRc+rfBRz1mBmF0i6V9LN7n5goedt3bTJH5yYCPa6AJCSvVt2LunP3bpt5ePufmXR84KmYtz9ZUnflXR1yHEBIAcX3Diy5KI+jMpHMWZ2oaQ33P1lMxuVtEPSpyvPDAAysnfLTumZZl4rxBn7Okl7e+fsyyR91d3/JcC4AJC8Jnbo84VIxTwlaWuAuQBAVtoo6hKfPAWAWrRV1KVAcUcAZ7tvalS3Hx/TT0+OaO3yGd08PqVrxqbbnhYa0GZB76OwA4HdNzWq2148Xyd89n+Ij55crttePF+SKO6Zi6GoSxR2ILjbj4+dLup9J3yZbj8+RmHPVCwFvY8zdiCwn54cGeo60hZbUZco7EBwa5fPDHUd6YqxqEscxQDB3Tw+ddYZuyStslO6eXyqxVkhpFgLeh+FHQisf45OKiY/F9w4os8/88dtT6MQhR2owTVj0xTyzDTZEqAqztgBYBFNNe4KiR07ACwgpV36XOzYAWCA1Hbpc1HYAWCOFI9e5uMoBgB6Uj16mY8dO4DOy2GXPhc7dgCdlssufS4KOzAPLXe7I6dd+lwUdmAOWu52Q64FvY8zdmCOxVruIg+5F3WJHTtwFlru5qsLBb2PHTswBy1389Sloi6xYwfOQsvdvHStoPdR2IE5aLmbj64WdYnCDpyDlrvp63JRlyjsSAj5chTpekHvo7AjCeTLsZhUvtmoKRR2JGGxfDmFvdtybAlQVeW4o5ltNLMHzeygmT1jZreEmBgwF/lyzJdb466QQuTYT0r6S3e/TNJvSPozM3tbgHGB08iXYy6OXhZX+SjG3Y9KOtr75ykzOyhpvaRnq44N9JEvRx9HL8WCnrGb2SZJWyX9IOS4APlysEsvL1hhN7PzJO2TdKu7vzLg93dJ2iVJG8bHQ70sOoR8eXexSx9OkMJuZis0W9TvcfdvDHqOu++RtEeStm7a5CFeF0gZufxi3BxdmsqF3cxM0h2SDrr7Z6tPCcgfufxiFPWlC5GK2S7pTyT9rpk92ft1TYBxgWzR931xFPVqQqRiHpJkAeYCdAa5/MEo6GHQjx1oAbn8c1HUw6GlANACcvlnUNDDo7ADLSCXP4uiXg8KOzpl97E12je1Wqc0ew553dhrmrjonI9dNKLLuXwKer0o7OiM3cfW6GtTq9W/139K6j1Wa8W9iyjq9ePmKTpj35yifob1rqNudGNsDjt2dMapIa8jHFoCNIsdOzpjoR92/iWoD7v0drBjR2dcN/baWWfss1zXjb3W1pSyxi69PWxW0BkTF72iG8Ze0zK5JNcyuW5oMRWTK3bp7WPHjk6ZuOgVCnmN6JkeBwo7orBrclyPvr7y9ONtK1/Xng3HW5xRNV1sycvRSzwo7GjdmaJ+5uz70ddXatfkeJLFvWsteTl2iQ9n7Gjd/KI+y87awaekSy15KepxYscOBNaFlrwU9LixYwcCy70lL0U9fhR2tG7bytclzf8aXO9dT8/N41NaZWd/njWXlrwU9TRwFIPW7dlwPKtUTI4teSnoaaGwIwrvPn9ah48vP10I333+8EWwTMSwqRhiTi15KerpobCjdSHigWXG6FoMsSoKero4Y0frQsQDy4zRpRhiFbQESB87drQuRDywzBhdiCFWxadH88COHa0LEQ8sM0buMcSq2KXng8KO1oWIB5YZI+cYYhUcveSHoxi0LkQ8sMwYOcYQq+LoJU8UdkQhRDywzBg5xRCroL1u3ijsmWoqrx1TdhzlsEvPH4U9Q03ltcmOp4ez9G4IcvPUzO40s2NmdiDEeKimqbw22fF0cIO0W0Lt2P9R0hck3R1oPFTQVF6b7HgaOHrpniCF3d2/Z2abQoyF6tYun9HRk+f+1YbOa5d5nabmgnOxQ++uxnLsZrbLzPab2f6XprqdG65bU3ltsuPxoqh3W2M3T919j6Q9krR106b5zbcRUFN5bbLj8aGgQyIVk62m8tpkx+NBUUcfhR21231sjfZNrdYpzZ79XTf2miYuemXo58SUzY8NRR1zBSnsZvZlSW+X9CYzm5T0CXe/I8TYSNvuY2v0tanVkkySdErqPdbpwl3mOTFl82NCQccgQW6euvv73H2du69w9w0UdfTtm1Owz7De9fLPiSmbHwuKOhbCUQxqdarE9TLPiSmb3zYKOorQthe1WugHbNmQz2mql3rMPdv59CjKorCjVteNvSZpfrrVe9fLPyembH4b6MaIYXAUg1r1b34ulngp85yYsvlNoyUAhkVhz1SoyF6ZGGIIW0ff0EPTM/rpyRG9efmMto6+Efw1pHLriSV3X3aX/tYjX9f253ZrbPqIpkbX6+FLJ3Ro/fUNzBCxorBnKFRkr0wMMcQYTbX/DbGeppTdpb/1yNe14+kPasXM7HuwZnpSO57+oCRR3DuMM/YMhYrslYkhhhijqfa/IdZTt2FvkG5/bvfpot63YmZa25/bHXpqSAg79gyFiuyViSGGGKOp9r8h1lOnpZylj00fGeo6uoEde4ZCRfbKxBBDjFFmviHWFGI9dVlqjHFqdP1Q19ENMfxMI7BQkb0yMcQQYzTV/jfEekKrmk1/+NIJvTEyeta1N0ZG9fClE1WnhoRxFJOhUJG9MjHEEGM01f43xHpCChFj7N8gJRWDucy9+dboWzdt8gcn2FGgm/j0KJbq1m0rH3f3K4uex44dtSuTqU+xVe5SpFzUycung8KOWjWVUY9dygVdIi+fGm6eolZNZdRjlnpRl8jLp4bCjlo1lVGPVQ5FXSIvnxqOYlCrtctndPTkuT9m8zPqRc9JTS4FvW9qdL3WTE8OvI74sGNHrZrKqMci157p5OXTwo4dtWoqox6DnNvrkpdPC4U9QiGif2XGaKolbxmxtMpdijq/BCOmiOGh9dcXvnZM8w0h1fVQ2CMTIvpXZoymWtjmHmWsu6inFDFMbb5FUl4PZ+yRCRH9KzNGUy1sc44y7t2ys9avq0stYpjafIukvB4Ke2RCRP/KjNFUC9sco4xN3SBNLWKY2nyLpLweCntkQrSnLTNGUy1sQ7UQjkXdu/S5UmvJm9p8i6S8Hgp7ZEJE/8qM0VQL21yijG3EGFOLGKY23yIpr4ebp5EJEf0rM0ZTLWxziDK2FWNMLWKY2nyLpLwe2vYCi8jxw0ZIV6Nte83sakmflzQi6R/c/VMhxsXShWqDWzROTFn4kCjocbvq6Q9r8+G7ZT4jtxE9tfEm/eev/f1QY6SaUS+jcmE3sxFJX5T0e5ImJT1mZt9y92erjo2lCZUdLxqnqSx80yjqcbvq6Q/rihfuOh3WNZ/RFS/cJUmli3vKGfUyQtw83SbpeXf/sbv/XNJXJF0bYFwsUajseNE4TWXhm7J3y06KegI2H757wE/d7PWyUs6olxGisK+XdHjO48netbOY2S4z229m+1+aSisRkZpQ2fGicZrKwjeBgp4O88FR2YWuD5JyRr2MEGfs8//jKZ2bo5O775G0R5q9eRrgdbGAUG1wi8ZZpsFFPKUMLQU9PW4jA4u4W/mNS+5tiEP8OzgpaeOcxxsk/STAuFiiUNnxonGaysLXhaKepqc23jTgp272elkpZ9TLCLFjf0zSJWb2FklHJL1X0h8FGBdLFCo7XjROU1n4OlDU09W/QVolFZNyRr2MIDl2M7tG0uc0G3e8090XvQNBjh1toaAjZY3m2N39Pkn3hRgrd2Xy5aEy6CEU5dRTWU+/vW6o7HJRjjrU64QYJ7W8dpn5pramptFSoEFl8uUx9S8vyqmnsp5+S4BQ2eWiHHWo1wkxTmp57TLzTW1NbUgpwJC8MvnymPqXF+XUY1/P/MZdobLLRTnqUK8TYpzU8tpl5pvamtpAYW9QmXx5TP3Li3LqMa9n0DcbhcouF+WoQ71OiHFSy2uXmW9qa2oDhb1BZXqTx9S/vKhne6zrWahneqj+2gvlpfvXQ71OiHFS6yleZr6prakNFPYGlcmXx9S/vCinHtt6inqmh8ouF+WoQ71OiHFSy2uXmW9qa2oDN08bVCZfHlP/8qKcekzrKdMzPVR2uShHHep1QoyTWl67zHxTW1MbKOwNu2ZsOqkvmZi46JVFP3BUZj11rnnYXPqh9dcHKQBHx7fpV1+8X2PTR/TqqnU6Or6t8piDlJlvTJHIpmKIof4ec0Vhj0wM8cBUtPVho6K4XZNxvBBzIZ6ZH87YIxNT3DFmbX6CtChu12QcL8RciGfmhx17ZGKKO8YohpYARXG7JuN4IeZCPDM/7NgjE1PcMTYxFHWpOG7XZBwvxFyIZ+aHwh6ZmOKOsYjtm42K4nZNxvFCzIV4Zn44iolMTHHHGMRU0PuK4nZNxvFCzIV4Zn6CtO0dFm17UUaMRR1oU6Nte4GQcijoRW19uzqXpnLuXW/rS2FHNAY17kpRUVvfrs6lqYw6WXhuniISCzXuSlFRW9+uzqWpjDpZeAo7WlbUuCtFRW19mxTTXJrKqJOF5ygGLSrTuCtFbiMDC+dC7X67Mpep0fVaMz058HqKrxMzduxoRW679LmK2vp2dS5NZdTJwrNjR8NyuUG6mKK2vl2dS1MZdbLw5NjRoKq79JgibCHmEiqGGNP7gnqRY0c0QuzSY4qwhZhLqBhiTO8L4sEZO2oVKsYYU4QtxFxCxRBjel8QD3bsqEXom6MxRdhCzCVUDDGm9wXxYMeO4OpIvMTUzjXEXBaKGw4bQ4zpfUE8KOwIqq4YY0wRthBzCRVDjOl9QTwqHcWY2Q2S/kbSZZK2ufv+EJNCeurOpccUYQsxl1AxxJjeF8SjUtzRzC6TdErSlyR9qGxhJ+6Yl5w/bATEpJG4o7sflCSz+ff30QW5FvQQufAyY5A/R10aS8WY2S5JuyRpw/h4Uy+LmuRc1KvmwsuMQf4cdSq8eWpmD5jZgQG/rh3mhdx9j7tf6e5XvmlsbOkzRutyLepSmFx4mTHIn6NOhTt2d9/RxEQQv5wLel+IXHiZMcifo07EHVEox57pCwmRCy8zBvlz1KlSYTez95jZpKTflPRtM/v3MNNCLHL6ZqMyQuTCy4xB/hx1qpqKuVfSvYHmgoh0ob3uICFy4WXGIH+OOtG2F+foyrELkBra9mJJ2irqMWW6yaAP1sU1p4rCDkntHr3ElOkmgz5YF9ecMlIxaP0GaUyZbjLog3VxzSljx95hsZylx5TpJoM+WBfXnDJ27B0VS1GX4sp0k0EfrItrThmFvWP2btkZVVGX4sp0k0EfrItrThlHMR0SW0HviynTTQZ9sC6uOWUU9o6oq6iHisAdWn99NEVi3fFHdd6Jo5Jc5504qnXHHz1nbjHNtyldXHOqKOyZq3OXnmME7qqnP6wrXrhL/W8YMJ/RFS/cJUlDf7sR0BbO2DNW99FLjhG4zYfv1vyvjbHedSAV7Ngz1NRZeo4ROPOZoa4DMWLHnpGm2+vmGIFzGxnqOhAjCnsm2mgJkGME7qmNN2l+WzzvXQdSwVFMBvZu2Sk90/zr5hiB698g3Xz4bpnPyG1ET228iRunSAptexPW1Z7pQFfRtjdj902N6u+m1mnqthMaG/2+tl9+sS77lXVtT2tBqbV7TW2+TeF9SQeFPTHf3bxaH//WL+rkzAlJ0tT0CT3wxLOSFGVxTy3rntp8m8L7khZuniZk75ad+ti/vVknZ06ddf3kzCk9fOD5lma1uNSy7qnNtym8L2mhsCeiH2Ocmj4x8PcXut621LLuqc23KbwvaaGwR25+Nn1sdNXA5y10vW2pZd1Tm29TeF/SQmGP2KBvNtp++cVaPnL2X9vykWXafvnFTU6ttNSy7qnNtym8L2nh5mmEFvv0aP8G6cMHntfU9AmNja6KOhWTWtY9tfk2hfclLeTYIxNrz3TEK0QMkShjGsixJ4YPG2EpQsQQiTLmhzP2CAw6SwfKCBFDJMqYHwp7yzh6QRUhYohEGfNT6SjGzD4j6Q8l/VzSf0n6U3d/OcTEckdBRwhTo+u1Znpy4PUmx0Bcqu7Y75d0ubtvlnRI0kerTyl/FHWEEiKGSJQxP5V27O7+nTkPH5HEnZZFUNARWogYIlHG/IRMxbxf0j8HHC8rFHXU5dD66ysX4RBjIB6Fhd3MHpC0dsBvTbj7N3vPmZB0UtI9i4yzS9IuSdowPr6kyaaIGCOAphUWdnffsdjvm9lOSe+U9A5f5NNO7r5H0h5p9gNKQ84zSW19sxGAbquairla0kckXeXuPwszpfSxSwfQpqpn7F+QtFLS/WYmSY+4+wcqzyph7NIBtK1qKibOloItYJcOIBb0igmAXTqAmNBSoCJijABiw459iSjoAGJFYV8Civpw6PUNNIvCPgQK+vDo9Q00jzP2kijqS0Ovb6B5FPYSKOpLR69voHkcxSyCgl4dvb6B5rFjXwBFPQx6fQPNY8c+DwU9LHp9A82jsPfQEqA+9PoGmkVhFy0BAOSl82fsHL0AyE1nC/sFN45Q1AFkqZNHMRy9AMhZp3bs7NIBdEFnduzs0gF0RfY7dnbpALom68JONh1AF2V7FMPRC4Cuyq6wc+wCoOuyOoqhqANAJjt2CjoAnJH8jp2iDgBnS7qwU9QB4FxJHsVQ0AFgYcnt2CnqALC4ZHbsFHQAKKfSjt3M/tbMnjKzJ83sO2b2y6Em1kdLAAAYTtUd+2fc/WOSZGZ/Ienjkj5QeVY9fHoUAIZXacfu7q/Mebhaklebzhns0gFgacy9Wi02s92SbpL0f5J+x91fXOB5uyTt6j28XNKBSi8ctzdJeqntSdQo5/XlvDaJ9aXuUncfK3pSYWE3swckrR3wWxPu/s05z/uopFXu/onCFzXb7+5XFj0vVawvXTmvTWJ9qSu7vsIzdnffUfI1/0nStyUVFnYAQH2qpmIumfPwXZJ+VG06AICqqqZiPmVml0o6Jem/VT4Rs6fi68aO9aUr57VJrC91pdZX+eYpACAuybUUAAAsjsIOAJlprbA30Y6gLWb2GTP7UW9995rZBW3PKSQzu8HMnjGzU2aWTbTMzK42s+fM7Hkz+6u25xOSmd1pZsfMLMvPj5jZRjN70MwO9n42b2l7TqGY2Soze9TMfthb2ycL/0xbZ+xmtqb/ydVeO4K3uXuwdgRtMrPfl/Qf7n7SzD4tSe7+kZanFYyZXabZG+ZfkvQhd9/f8pQqM7MRSYck/Z6kSUmPSXqfuz/b6sQCMbPflvSqpLvd/fK25xOama2TtM7dnzCzMUmPS3p3Dn9/ZmaSVrv7q2a2QtJDkm5x90cW+jOt7djrbEfQNnf/jruf7D18RNKGNucTmrsfdPfn2p5HYNskPe/uP3b3n0v6iqRrW55TMO7+PUnH255HXdz9qLs/0fvnKUkHJa1vd1Zh+KxXew9X9H4tWi9bPWM3s91mdljSjZptIJaj90v617YngULrJR2e83hSmRSGrjGzTZK2SvpBuzMJx8xGzOxJScck3e/ui66t1sJuZg+Y2YEBv66VJHefcPeNku6R9Od1ziW0orX1njMh6aRm15eUMuvLjA24ls3/RXaFmZ0naZ+kW+edCiTN3WfcfYtm/+9/m5ktepxW6xdt5NyOoGhtZrZT0jslvcMT/LDAEH93uZiUtHHO4w2SftLSXLAEvfPnfZLucfdvtD2fOrj7y2b2XUlXa5FGim2mYrJtR2BmV0v6iKR3ufvP2p4PSnlM0iVm9hYz+wVJ75X0rZbnhJJ6NxjvkHTQ3T/b9nxCMrML+8k6MxuVtEMF9bLNVMw+SWe1I3D3I61MJjAze17SSkn/27v0SC6JH0kys/dIul3ShZJelvSku/9Bu7OqzsyukfQ5SSOS7nT33S1PKRgz+7Kkt2u2re3/SPqEu9/R6qQCMrPfkvR9SU9rtqZI0l+7+33tzSoMM9ssaa9mfy6XSfqqu9+26J9J8JQAALAIPnkKAJmhsANAZijsAJAZCjsAZIbCDgCZobADQGYo7ACQmf8H3pmiSzdZTIIAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_decision_boundary(svc_soft, axis=[-3, 3, -3, 3])\n",
    "plt.scatter(X_standard[y==0, 0], X_standard[y==0, 1])\n",
    "plt.scatter(X_standard[y==1, 0], X_standard[y==1, 1])\n",
    "plt.show() # 可以看出C很小时得到的决策边界显然更合理些"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.绘制margin对应的两根线"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.43789677, -0.4109186 ]])"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "svc_soft.coef_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.00592672])"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "svc_soft.intercept_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_svc_decision_boundary(model, axis):\n",
    "    \"\"\"\n",
    "    根据模型绘制决策边界\n",
    "    \"\"\"\n",
    "    x0, x1 = np.meshgrid(\n",
    "        np.linspace(axis[0], axis[1], int((axis[1]-axis[0])*100)).reshape(-1, 1),\n",
    "        np.linspace(axis[2], axis[3], int((axis[3]-axis[2])*100)).reshape(-1, 1),\n",
    "    )\n",
    "    X_new = np.c_[x0.ravel(), x1.ravel()]\n",
    "\n",
    "    y_predict = model.predict(X_new)\n",
    "    zz = y_predict.reshape(x0.shape)\n",
    "\n",
    "    from matplotlib.colors import ListedColormap\n",
    "    custom_cmap = ListedColormap(['#EF9A9A','#FFF59D','#90CAF9'])\n",
    "    \n",
    "    plt.contourf(x0, x1, zz, linewidth=5, cmap=custom_cmap)\n",
    "    \n",
    "    w = model.coef_[0]\n",
    "    b = model.intercept_[0]\n",
    "    \n",
    "    # 直线为 w0 * x0 + w1 * x1 + b = 0,上面的边界为w0 * x0 + w1 * x1 + b = 1，下面的直线为 w0 * x0 + w1 * x1 + b = -1\n",
    "    # 等效于 x1 = -w0/w1 * x0 - b/w1\n",
    "    plot_x = np.linspace(axis[0], axis[1], 200)\n",
    "    up_y = -w[0]/w[1] * plot_x - b/w[1] + 1/w[1]\n",
    "    down_y = -w[0]/w[1] * plot_x - b/w[1] - 1/w[1]\n",
    "    \n",
    "    up_index = (up_y >= axis[2]) & (up_y <= axis[3])\n",
    "    down_index = (down_y >= axis[2]) & (down_y <= axis[3])\n",
    "    plt.plot(plot_x[up_index], up_y[up_index], color='black')\n",
    "    plt.plot(plot_x[down_index], down_y[down_index], color='black')\n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Hard Margin的SVM"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\ProgramData\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:17: UserWarning: The following kwargs were not used by contour: 'linewidth'\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_svc_decision_boundary(svc_hard, axis=[-3, 3, -3, 3])\n",
    "plt.scatter(X_standard[y==0,0], X_standard[y==0,1])\n",
    "plt.scatter(X_standard[y==1,0], X_standard[y==1,1])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Soft Margin的SVM"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\ProgramData\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:17: UserWarning: The following kwargs were not used by contour: 'linewidth'\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXYAAAD8CAYAAABjAo9vAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nO3dd3hUdfbH8feX0CICLkgTUGwo/pAiilJ0d6WqawFBRTqr9CZiRbqIoiLNhtJ7E0GqICCCAtJ7sQEBpAqEkECS+f7+SLKGkGQmme/Mbef1PD7PJk7unBvx7PXO55yrtNYIIYRwjxxWFyCEEMIsaexCCOEy0tiFEMJlpLELIYTLSGMXQgiXkcYuhBAuE3RjV0rlVUptUEptU0rtUkr1N1GYEEKI7FHB5tiVUgrIp7W+oJTKBawBummt15koUAghRNbkDPYAOun/GS4kf5kr+S+ZehJCCIsE3dgBlFIRwCbgNuBjrfX6dF7TFmgLkC9Pniq3Fy9u4q2FcKy/YmKIi4+nxHXXWV2KsEBEITgRWzhLP3N47+ZTWusi/l4X9K2YKw6m1HXAXKCL1npnRq+rXKaMXtmrl7H3FcJJzsbE0HPaNOZs2MB9t9zCNy+/TJ5cuawuS4TRhEots/Vz3avm2aS1vtff64xcsafQWp9VSq0C6gMZNnYhvGrl7t10Hj+eE+fP0+vJJ+levz45IyKsLkuEyXVNIxi+q1nI3yfoxq6UKgLEJzf1SKA28F7QlQnhIhcvXaL/3LmMXrGCssWLM6VTJyrddJPVZYkwmlCpJewKz3uZuGIvAUxIvs+eA5iptV5g4LhCuMLmP/6g/ZgxHDh+nPa1atGnQQMic+e2uiwRJtm97RIME6mY7UBlA7UI4SrxCQkMXbyY9xcupFjBgnz90kv8s1w5q8sSYWRFUwfD99iFEEkO/Pkn7ceOZfMff9D4/vt5v0kTCl5zjdVliTCyqqmDNHYhjPL5fHy5ahW953yFL2ceijz5GofLV2NtYjSPEmt1eSIMrGzoKaSxC2HI0b/+osuECazYvZt8t9zDdY90J+e1hTiWAANOFgTg0fzS3N3MDk0dpLELYcScDRvoOXUqlxMSuLl+exIrPEbSto0kcToHI8/kl8buUnZp6CmksQsRhL9iYug5dSpf/fwz991yC5+1acPT0RVRqKte+2eC5NXdyG5NHaSxC5FtK3btovOECZxMM2xUPDaRYwlX/6tVPGeiBVWKULJjUwdp7EJk2cVLl+g7Zw5frlrFHSVKMDXNsFGXQtEMOFmQOP33Vuy8ykeXQtFWlCtCwK4NPYU0diGyIPWwUYdateidzrBRyn30kWfy82dCBMVzJtKlULTcX3eBcK0ECJY0diECEJ+QwIeLFvHBokUUL1iQeT168NCdd2b4+kfzx0ojd5lwrgQIljR2Ifw48OeftBszhi0HD/LM/fczRIaNPMUpV+mpSWMXIgMpw0Z958whMnduxrdrx5NVqlhdlggjJ12lpyaNXYh0HPnrL7qMH8/KPXuoXb48I1u0oLg8EMNT7P4BaWaksQuRxuzkYaP4hAQ+bNqU1g89dMWwkXA3J956SUsauxDJ/oqJ4eUpU5i7cSP33XILn7Zuza3Filldlggjp956SUsauxBkPGwkvMENV+mpSWMXnpZ62OjOEiWY1qkTFeXJRp7ilqv01KSxC8/a9PvvtB87ll+OH6dj7dr0btCAvLlysSg6UoaLPMLJH5BmRhq78JzMho0WRUdesQ7gWEJOWbnrQm5t6CmksQtP2X/sGO3HjmXLwYM8+8ADvPfcc1cMG408k/+KHS8gK3fdxu1NHaSxC4/w+Xx8sXIl/b76imsyGTbKaLWurNx1Pi809BTS2IXrHfnrLzqPH8+qPXuoU748IzIZNiqeU1buupGXmjpIYxcuprVm9oYNvDJtGvEJCQxt2pRWfoaNZOWuu3itoaeQxi5cKe2w0Wdt2nBL0aJ+f05W7rqHV5s6SGMXLvTdrl10Hj+eU9HRvPXUU3SrVy9Lw0ayctf5vNzUQRq7cBB/+fKY5GGjMcnDRtM7d5ZhI4/xekNPIY1dOIK/fPnG336j/dix/HriBB1r1+atp5666slGwr3cthIgWNLYhSNklC8ffjKSrSumM3TxYooXLMj8Hj14MJMnGwn3ceNKgGAF3diVUqWBiUBxwAeM1loPD/a4QqSWXo48/vRhti74kA1//sJz1arx7rPPypONPESu0jNm4oo9AXhZa71ZKZUf2KSUWqa13m3g2EIAV+bLtfYRvWkBZ78fT0SuPExo144n5MlGniJNPXNBN3at9THgWPL/jlZK7QFKAtLYhTEp+fIL585wetEw4g5uJd+t9zKkWUueKJnH6vJEGMmtF/+M3mNXSpUBKgPrTR5XiEeuvcjazT/y+ZyJ+BITufmRDgysVY3HCsRZXZoIE7lKD5yxxq6UuhaYA3TXWp9P5++3BdoClCpUyNTbCg9IPWxU9dZb+ax1a24uWhSQpu4VcpWeNUYau1IqF0lNfYrW+qv0XqO1Hg2MBqhcpow28b7C/VIPG/Vu0IBu9eoRkSOH/x90ANn77p/k0rPHRCpGAWOAPVrrocGXJETSsFGf2bMZ+/333FmiBDO6dKHCjTdaXZYxsvfdP2nq2Wfiir0G0BzYoZTamvy9N7XWiwwcW3hQyrDRbydP0qlOHd566iny5spldVlGyd73zElTD46JVMwaION1eUIEKD4hgfcXLmTo4sWUuO465r30kmuHjWTve/qkoZshk6fCFvYlP9lo68GDnhg2kr3vV5Ombo40dmEpn8/H6JUr6Z/8ZKOJ7dvz+D33WF1WyMne979JQzdPGruwTNSZM3QeP57v9+6l7t13M6JFC4oVLGh1WWEhe9+TSFMPDWnsIuy01szasIFXpk4l0edjWPPmtKhZM9MnG5ky6EQB5kTnwwfkAJ7OH0OvoleNXYSFl/e+S0MPLWnsIqzOXLhAz6lT0xk2Cr1BJwowKzofKZ/1+yD5ayxr7l4kTT30pLGLsFm+cyddJkzg9IULlgwbzUnV1P+mmBOdTxp7GMhKgPCRxi5C7ophoxtuYGbXrtxdunTY6/Bl8fvCHFkJEF7S2EVIpR426lynDr0sHDbKQfpN3B0LCuxJrtKtIY1dhER8QgJDFi5k6KJF3PCPfzC/Rw9q3nGHpTU9nT/minvsSTRP54+xqiRXk6t060hjF8alHjZ6vnp1Bj/7LAUiI60u63/30e2SinEruUq3njR2YUzqYaN8efLYctioV9Hz0shDSJq6PUhjF0ZEnTlDp/HjWb13L/UqVGB48+ZZGjZqG1WIDZf+fhJS1TyXGF3qTChKDQsvruSVWy/2IY1dBMXEsNHfTf3vn9lwKQ9towo5srl7bSWv5NLtRxq7yLYzFy7QY/Jk5m3ezP233sqn2Rw2StvUk6grruCdxEsreaWp25M0dpEty3bsoMuECZyJiaFPgwZ0ddGTjYLlhZW80tDtTRq7yJKYS5foPXs2477/nnI33MCsbt0sGTayM7ev5JWmbn/S2EXAfk4eNvrd8JONqua5lM7tGE3VPJeCPrYV3LySV5q6M0hjF35dTkhgyIIFfLR4MSULFeKbHj2oYXDYaHSpM65KxbhxJa80dGeRxi4ytffoUdqNGcP2w4dDOmz0VMFYDp/J+b9G+FTBrDfBQCKG4YohumklrzR155HGLtKVdthoUocO/Kdy5ZC8l4l4YCDH8FoMMVjS0J1LYgziKlFnztBg2DDemDGDf5Urx4/9+oWsqUPm8UCTxzDxPl5wXdMIaeoOJ1fs4n+01sxcv55Xp03D5/MxvHlzmofhyUYm4oGBHMMLMcRgyfSoO0hjF8DVw0aftWlDmSJFwvLeJuKBgRzD7THEYMlVunvIrRjBsh07qN6vH4u2baNPgwYsfOWVsDV1SIoH5lVXbkrPajwwkGOYeB83klsv7iNX7B52IS6O3rNnM371akuHjUzEAwM5hhtjiMGSWy/uJI3dozb8+isdxo3j95Mn6Vy3Lr2efNKyJxuBmXhgIMdwUwwxGLJe192ksbtURnlt08NGdsqOi8DIVbr7SWN3oYzy2lF/HmHqjE/YdugQTatX550gh40kO+48ci/dG4x8eKqUGquUOqGU2mnieCI4afPaWvs4sWE+rw/tTdSZM0zu0IFRrVoFPUEq2XHnkA9IvcXUFft4YBQw0dDxRBBS57ITzp/g1MJhXDq0nchb7+PHDs9StEAB4++T0fclO249ufXiPUYau9Z6tVKqjIljieAVz5nI0fgIYnat5Mzyz0H7KFS/C7ff8zBFC5w0+j6SHbcvuUL3rrDl2JVSbZVSG5VSG09Fezs3HGqtch/lzLzBnF44lNzX30SJ1iMpUqkOXQtfMPo+kh23L2nq3ha2D0+11qOB0QCVy5TR4Xpfr/l2xw76TJhAbEwMpf/dghz3NqREbuhS6JzxDyslO24/0tAFSCrGNVIPG91VsiSz/zdsdCKk7yvZcfuQpi5SSGN3gdTDRl2Sh43yWDhslNagEwWYE50PH0n3/p7OH0Ovouez/Jpw5eGdmLuXpi5SM9LYlVLTgH8B1yulooC+WusxJo4tMnbVsNHLL1OjbFmry7rCoBMFmBWdj5TH3vkg+Wv+17gDeU248vBOy91LQxfpMfLhqda6ida6hNY6l9a6lDT10Ntz9Ch1Bg/mw0WLaFKtGmv69LFdUweYk6ph/00lfz/w14QrD++k3L00dZERuRXjMD6fj8+++44Bc+dybd68TO7QgcdC+BCMYPkC+H4grwlXHt4JuXtp6N6UEH854NdKY3eQQ6dP02ncONbs30/9ChUY3qKFsWGjUMlB+o07RxZfE648vJ1z97K4y7uO7N/O5L6tAn697GN3AK0103/6iZr9+7P14EFGtmjB1E6dbN/UIelDUEibbtXJ3w/8NeHKw9s1dy9N3Zt8iYksn/ABQ1tVJ+bs6YB/Tq7Ybe50dDQ9pkxh/ubNPHDbbXzaunVYH4IRrJQPPzNLvATymnDl4e2Yu5eVAN506shvTO33Ar9tW0vFhxvS+PWRvFW3ZEA/K43dxpZu307XiRP5KyaGfg0b0rluXSJyBPYfWaYie4HEEE2oHBnPmthE/kyIoFjORCpHxht/DwjsfOySuw/0Kr3skdnU2DeI/LFHiI4sydo7erG/ZKMwVChCQWvN+vnjmftRT1SOCJr1H0eV+k2y9Oxhaew2dCEujrdmzWLCDz+kGTYKjKnIXiAxRBPHCNf6XxPnEy6BXqWXPTKb2jt6kCsx6XdQIDaK2jt6AEhzd6Do08eZ/k4Hdv2wkNvv/RfP9/2SfxTL+lPN5B67zaz/9VceGjiQiWvW0KVuXVa8+WaWH1dnKrIXSAzRxDHCtf7XxPmEWlbX69bYN+h/TT1FrsRYauwbZLo0EWLbV87j3Sb3sG/9cp566X06jFqcraYOcsVuG5cTEnj3m28YvmQJpQoVYkHPnlS//fZsHctUZC+QGKKJY4Rr/a+J8wml7NxLzx97JEvfF/YTd+E8Xw19mQ0LJlLqzso06zeO4reUC+qY0thtYM/Ro7QbM4Ydhw/TrEYNBj3zTFAPwTAV2QskhmjiGOFa/2vifEIlu9n06MiSFIiNSvf7wv5+2byaKf1f4Ozxw9Rp/Tr1XuhFzly5gz6uHf5Me5bP5+PjZcv499tvc+zsWaZ07MjIli2DfrKRqcheIDFEE8cI1/pfE+djWrBPNlp7Ry/iI6788xIfEcnaO3oFW5oIofhLccwb/hofd6hLRM6cdB29ksc69DfS1EGu2C2Tetjo0YoVGda8OUUM5dJNRfYCiSGaOEa41v+aOB+TTMQYUz4glVSMc0Tt38aUvq059usuqjd8kSe7vUeeSLOf8yitw78avXKZMnplL29eUWitmbFuHa9Om4bWmsHPPkvTGjWyFGUSziYrAbzJl5jId5M+ZMnoAeQrWJjnen/OXdXrZ+kY3avm2aS1vtff6+SKPYxOR0fz0uTJfLNlC9Vuv51PW7fmpuuvt7qskAskU+/EVbnZ4eSmLnn57DsV9StT+r/A79t+pOLDDXnm9VHku65wyN5PGnuYLNm+nW4TJ3L24kX6P/00nerUCXjYyMnClVG3Oyc3dJC8fHZprVk3byxzP3qFHBE5aTZgPFXqPRfy/0KXxh5iqYeN/q9UKeZ07075UqWsLitsMsufp75v7u81Tub0pg6Z5+Wlsafv/Kk/mfFOB3atWRTUsFF2SGMPofW//kr7MWM4ePo0XevV480nnrDVk43CIVwZdbtyQ1MHyctn1faV85gxuCOXYy/QoMcHPPhMJ3KE8b/QpbGHgMlhI6cLV0bdbtzS0FNIXj4wsRfO8dWHL/PzwknGho2yw/03ecNs95Ej1B48mI8WL6ZpjRqs6dvXs00dwpdRt4tgc+l2JXl5/37ZvJohTe9j4+Ip1G3zBt3HrLakqYNcsRvj8/n4ZPly3v76awpERjKlY0cerVTJ6rIsF66Muh24eb2u5OUzFn8pjkWf9WXV1OEULnUL3b5YRZm777e0JmnsBhw6fZqO48ax1tCwkYnoXyDHCNdK3kDYZVVudoTyIRh2ihjuL9nI73vbqV4T/J1P1P5tTO7Tij9/202Np9vyRNd3jQ8bZYc09iCkPNnotenTARjVsiXPV68eVJTJRPQvkGOEa4Wt26OMoW7qTooYOq1efzI7n73FG1wxbNR22LwsDxuFkkyeZtOp5GGjBVu2UD152OhGA8NGjxwsmu4HiSVyJrD4phPGjnHPryXwXbXCFnKg2XzrsSxWHVwtThXqe+mtV1RO9wPL85GlGPfwlpC+d3Y4rV5/MjqfrReL0nBpEX7f/hOVaj1N49dGhnTYKDWZPA2hJdu303XCBM7FxjKwUSM61q5tLMpkIvoXyDHCtcLWjVHGcD1/1GkRQ6fV60/aurXWfLE5nh5LfyExz8mwDRtlhzT2LIiOi+OtmTOZuGYN5UuVYu5LL/F/hoeNTET/AjlGuFbYui3KGM4PSJ0WMXRavf6kPp8/L/h4YX4cCw8k8NCt1/DvYZvCNmyUHRJ3DNC6X37hoQEDmLR2Ld3q12f5G28Yb+pgJvoXyDHCtcLWLVFGK2KMTosYOq1ef1LO56s98ZT/JIbvfk/gw0fy8+qQz23d1EGu2P26nJDA4PnzGbF0KaULF2Zhz55UC2Eu3UT0L5BjhGuFrRuijFbFGJ0WMXRavf5sK1iHD1eU5btVP1ClRASfNinDqQcHOOJ85MPTTOw+coR2Y8awMyqK5jVrMuiZZ8ifN6/VZYkwcuOwkfDvwMZVTB3wImdPRCU92ei/bxKR0/p1IGH98FQpVR8YDkQAX2qt3zVxXKsk+nx8unw5A7/+moIOHTYytQbX33HslIU3SRq6vf1zx6tUODwRpRPRKoLtpVvw/d1DsnSM9DLqu67/Dws+6c3300ZQpPRtdPvye8qUrxqiswidoBu7UioC+BioA0QBPyul5mutdwd7bCukHjZ6rFIlhjVvzvX581tdVpaYyo77O064svDhJk3d3v6541UqHhr3v7Cu0olUPDQOIODmnl5GvfC3XRi14DUOHo6y1bBRdpi4Yq8K/KK1/g1AKTUdeBJwVGPXWjPtp594PXnY6ONWrWhSrZoto0z+mFqD6+84c1I19b8p5kTnc2Rjl4buDBUOT0znT13S9wNt7KnXECf6NEPWXqbvqvMUzneedsPnU65aPbNFh5mJxl4SOJzq6yjgqkUJSqm2QFuAUoUKGXhbc1IPG9UoW5ZPWrUyMmxkFVPZcX/HCVcWPhykqTuH0ulHZTP6fnpSMuq/nvHR4utYfjycSOO7cvLJY5FMcXhTBzONPb1L2qs+kdVajwZGQ9KHpwbe14hQDhtZxVR23N9xwpWFDyVp6M6jVUS6TVyrwC9czue9gZlrf+elpXHkzAFTGkbSpHxOoq+xd4wxUCb+HYwCUv82SgFHDRw3pKLj4ug2cSJNRo2iWMGCrHjzTTrXrev4pg7msuP+jhOuLHyoSFN3pu2lW6Tzpy7p+4E4f+pP6szOQ9sFcTxQKoIdHa7l+btzkZDzGsdm7tMyccX+M3C7Uupm4AjwHPC8geOGzE8HDtBx3DgOnT5N9/r1ef3xx131ZCNT2XF/xwlXFj4UpKk7V8p99OykYrat/JqZ73TkclwM7f7bnHdv3UjBS0c57/DMfVpGcuxKqUeBYSTFHcdqrQdl9nqrcuyX4uMZ/M03jFi6lBsLF+bT1q1DOmwk7EcaujfFXjjHVx/04OdFkyl95z007T+W4jdb8xCMYIQ1x661XgQsMnGsUEk9bNSiZk3etmjYKJB8uakMugn+cupOOZ+UxV2m9oX7y1Gbeh8Tx3HajvRA6s3KOaUMG507eYR6L/Sibps3bDFsFEquXymQmOrJRgUjI5naqROPVKxoSS2B5MvttL/cX07dKeeTshLA1L5wfzlqU+9j4jhO25EeSL2BnlP8pbgrho26frHKkcNG2eH8TwozcejUKZ748EP6zJ5NnfLl+bFfP8uaOmSeC8/Ka8Ils5w62P980i7uSp1dTpErMZYa+zK9c3iVzHLUJt/HxHFM1RIugdQbyGui9m3lwxYP8P20EdRs1I6ekzd4pqmDS6/YtdZM/fFH3pgxA4BPWrXiORsMGwWSL7fT/nJ/OXU7n096O9NN7Qv3l6M29T4mjuO0HemB1JvZaxITEvhu4gcs+WIg1/6jiCuGjbLDdY39VHQ03SdNYuHWrUafbGRCIPlyO+0v95dTt+v5ZLSN0dS+cH85alPvY+I4TtuRHki9Gb1ma0wRRrarxR871lGpdqOkJxsVtNcwZLi46lbM4m3bqN6vH8t27mRAo0bMf/ll2zR1CCxfbqf95f5y6nY7H387003tC/eXozb1PiaO47Qd6YHUm/Y1Wms+2aypNvIwx//YS/OBE2n1zhTPNnVwyRV7dFwcvWbOZFIIn2xkQiD5cjvtL/eXU7fT+QSyM93UvnB/OWpT72PiOE7bkR5Ivalfc+HEYVov1Hy77wJlqz7M872/4Lpi9vt3P9wc39h/OnCADsnDRt3q1+cNmw8bPZo/1lEPmehV9HymA0eBnE8ozzmrufT9JRsZaWrHClXllpPLyB97hAt5S3CsUGg+mAukXjtFIsMVrdxfshGz9kUwc0wnLsfF0PDlodRs3MEVk+MmOLaxpx02CvWTjcLFDvFAp7Bq2Mhf3C6cEUMTtTgtnnnFsFG5KjTrP5ZiZe4MuE4vcOT/ve2KiqLW4MEMX7KEFjVr8kOfPq5o6mCvuKOdWTlB6i9uF86IoYlanBTPPLBxFUOev5dNS6dR74VedB/zvTT1dDjqij3R5+PjZcsYNG+e5cNGoWKnuKMd2WElgL9IXjgjhiZqcUI8M+f5KOZ+9ErSsNGNt9Pty++56f/uy1J9XuKYxn7w1Ck6jBvHTwcO8J/KlfmoWTPHPdkoEHaKO9qNHZo6+I/khTNiaKIWu8cztxxL5PmvE9h7ImnY6PEugx37ZKNwsf2tGK01U9au5cEBA9h5+DCftGrFxPbtXdnUwV5xR7uYUKmlbZo6+I/khTNiaKIWu8YzE3yaQasvUfXLGE7ER9Ju+Dc0enWENPUA2PqK/eT583SfNIlF27a54slGgbBT3NEO7NTQU/iL5IUzYmiiFjvGM4uv7Uun6b/zU1QiD9V8gHp953o6l55VRtb2ZlUga3sXbd1Kt0mTiI6NpXeDBnSoVUuiTB5jx6YuQktrzY9ffcG84a8RkSs3jV4dQZV6z1pdlm2EdW2vSdFxcbw5YwaT166lfKlSzOvRg7tK2nP8WYSGGxq6v7W+Xq0ls5z7uVPHmP52O/b8uJQ77q9Fk7dGZ3vYyGmrik2zVWP/MfnJRodPn+alRx7h9ccfJ3dOW5UoQii9xV1O5G+tr1drySyjPnNvDmYO7kT8pYtBDxs5bVVxKNiia16Kj+ed+fMZ+e233FS4MAtfeYUHbrvN6rJEGAWyEsApMlvrG+5maqda0suox8RcZMKAjszYcs7YsFFmWXhp7GGyMyqK9mPHsisqipYPPsjbjRtzrQVPNhLWcMtVemr+1vqGk51qSZtRX/F7Aq2+juVotKbeC29Rt83rRp5s5LRVxaFgWWNPPWx03TXXMK1zZ+pXqGBVOcICbrpKT83fWl+v1pKSUY+N17z53SWGrb9M2cI5WNaxDNtb9jb+Pul93yssiZlcTkjg8Q8/pO+cOdS9+27W9u0rTd1j3PABaUb8rfX1ai1r7+jFhuM5qTI6hmHrL9P5vlxs6HA9cbXfNv4+TlpVHAqWXLHvPXqUfHny8Gnr1jz7wAOWP9lIhI8bb72k5W+trxdrSUxIYNSSAyz98hxF8+VgSbO8VCtfJiRpFaetKg4FS3Ls+fPm1Wv79ePGwoXD/t7COsFepdspwmaiFlMxRDv9XtJz8vAvTO7bhoM711O5TmMavTpCho2yydY59luLFZOm7iEmrtLtFGEzUYupGKKdfi9ppR02aj5wogwbhYkl99jl1ot3TKjU0sitl3Cuwg1HLZnFEMNdSyicO3WM0S89yaz3unBzxWq8NnWTNPUwsjzuKNzJ9IejdoqwmajFVAzRTr+XFFuXz2Hmu52JvxTL0z0/okaj9rIOJMyksQvjQpF4sVOEzUQtpmKIdvq9XIw+y5z3u7NpyTR5spHF5P9GhVGhijHaKcJmohZTMUS7/F72/7ySIU2qsGXZTOq98JY82chiQV2xK6UaA/2AckBVrfVGE0UJ5wl1Lt1OETYTtZiKIVr9e7kcF8uCT95i9fRRFL2pLN3HrObGu/yGNkSIBRV3VEqVA3zA50DPQBt7IGt7hXO4edhIZOzwns1M7tea47/v5cHGHXi8yzvkznuN1WW5WljijlrrPSApF69ya0M3kQsP5Bh2z59nJDEhge8mvM+SL98mf+FitB+xgDsfqGN1WSKVsH14qpRqC7QFKFVIhhOczs1NPdhceCDHsHP+PDMnDx1gcr//Jg0b1X2Gxq+O4JoC/7C6LJGG3w9PlVLLlVI70/nryay8kdZ6tNb6Xq31vW59XqlXuLWpg5lceCDHsGv+PCNaa9bM/pz3m1XlxNCElnYAAA6hSURBVMF9tHh7Ei3fniRN3ab8XrFrrWuHoxBhf25u6ClM5MIDOYYd8+cZufLJRrVp0ns01xX1zqZEJ5Icu/DLC4u7UpjIhQdyDDvlzzNzxbDRK8Oo2ai9fKbmAEHl2JVSDZRSUUA1YKFSaqmZsoRdmFoJ4BQmcuGBHMMu+fOMXIw+y6Q+rRj/5vNcX+oWek5ez4ONO0hTd4hgUzFzgbmGahE24qWr9NRM5MIDOYbV+fPM7N+wgqkDXuT86WPUf7E3dVq/ZuTJRiJ8LFnbKzl2e/PCvXRxtbTDRs36j5NhI5ux9dpeYV9WNXU7ZbrdnEHPyOE9m5nUtxUn/tiX4bCR287ZzaSxC8DaWy92ynS7OYOensSEBJZPGMLSLweRv3AxOoxcyB33Xx2Ec9M5e4EsAROWf0Bqp0y3GzPoGTlxcD8j2v6bxZ/3p1Ktp3lt6qZ0mzq455y9Qq7YPcwu99LtlOl2WwY9PVpr1s75nPkj3iBn7jy0GDSZe+o0zvRnnH7OXiNX7B5ll6YOGWe3rdq17u/7dqo3q86dPMrn3R5n9pBu3FyxOq9O3eS3qYOzz9mLpLF7zIRKLW3V1MFemW43ZNAzsmXZbN5rcg+/bllDo1eH037EgoAnSJ16zl4lt2I8xG4NPYWdMt1Oz6Cn5+L5v5KebLR0Ojf+33006zeWojeVzdIxnHbOXieN3SNC1dRNReD2l2xkmyZR4swGro07BmiujTtGiTMbrqrNTvVmZt+G75g64EWiTx+nfts+1Gn1GhE5s/evvVPOWUhjd71QXqW7MQL3zx2vUvHQOFIG55VOpOKhcQBZfrqRlS7HxbLg416snvExRW8qy3/HrObGu6pYXZYIE7nH7mKhvvXixghchcMTSbsNRSV/3ykO79nMBy3uZ/WMj3no2U70nLRBmrrHyBW7C4XrXrobI3BKJ2bp+3aSetioQOHidBi1iDuq1rK6LGEBaewuEu7pUaesns0KrSLSbeJaRVhQTeBOHNzPlP7/5eDODVSp9xxPvzJMHoLhYXIrxiWsWAngxgjc9tItSLsWTyd/346Snmz0GR80v5+Thw7QctAUmg+cIE3d4+SK3QUmVGoJu8L/vm6MwKV8QFrh8ESUTkSrCLaXbmHLD07PnTzKtIFt2btuGXc+UIcmvUdTsMgNVpclbEDW9jqYV3emC9i8bBaz3+tC/KU4nuz2HjWebisPwfAAWdvrYouiIxkcXYLoAXHkj/yBGuVvo9yNJawuK0NOW/dq53ovnv+L2UO6sfnbGdkeNsouO/9exJWksTvMqgr56DP/HyQkxgEQHRvH8s27AWzZ3J2WdbdzvSaHjbLKzr8XcTX58NRBJlRqSe8lxUhI9F3x/YREH2t3/mJRVZlzWtbdjvVejrvInA9e4tPOj5LnmmvpPmY19V/oFbamDvb8vYiMyRW7Q6Rk06Nj49L9+xl932pOy7rbrd5DuzcyuW9rThzcz0PPduI/nQaRO2+k/x80zG6/F5E5uWK3ueuaRlwxcJQ/Mm+6r8vo+1Zz2rpXu9SbmBDPki/eZth/H+Jy7EU6jFpEw5eHWtLUwT6/FxEYaew2lt6TjWqUv42cEVf+Y8sZkYMa5W8LZ2kBc1rW3Q71Hj+4j+Ev/IslXwykcu3GvDptk+UTpHb4vYjAya0YG8psJUDKB6Rrd/5CdGwc+SPz2joV47Ssu5X1pgwbzR/xBrnyRNJy0BQq17HH78lp/xy9TnLsNmPXnekitM6eOML0t9slDRtVq0uTtz4PeNjIRAxRoozOIDl2h5FhI+/asmw2s97rTMLlSzR+bSTVG74Y8LCRiRiiRBndRxq7DVi1EkBYK/Ww0U3lq9Ks31iK3Hh7lo6RWQwx0KZs4hjCXqSxW0xuvXjTvvXLmTqwLdGnj/Nou37UavlKtnLpJmKIEmV0n6Aau1LqfeBx4DLwK9Baa33WRGFuJw3dmy7HXeSbUb34YeYnFLv5Tl54fzaly92T7eOZWJ3sxvXLXhds3HEZUF5rXQHYD7wRfEnuJ03dmw7t3sgHze/nh5mf8NCznXh5wrqgmjqYiSFKlNF9grpi11p/m+rLdYDckMuENHRvSkyI59ux77Js3GAKFC5h9MlGJmKIEmV0H5P32NsAMwwez1WkqXvT8YP7mNK3DYd2b6RK/SZJTzbKf53R99hfslHQTdjEMYR9+G3sSqnlQPF0/lYvrfW85Nf0AhKAKZkcpy3QFqBUoULZKtaJJMboTT6fj7WzP2P+yDfJlSeSVu9MpVLtp60uS3iE38auta6d2d9XSrUE/gPU0plMO2mtRwOjIWlAKYt1OpLEGL3p7IkjTBvYln3rl2d52EgIE4JNxdQHXgP+qbW+aKYk55OrdO/a/O1MZg/pmq1hIyFMCfYe+yggD7As+Q/vOq11+6CrcjC5SvemmHNnmP1+N7Z8OzPbw0ZCmBJsKsaeKwUtIFfp3rV33TKmDWxL9JkTQQ0bCWGK/OkzQK7Svely3EW+GfkmP8z6NGnY6IM5QefShTBBGnuQJMboTYd2b2RSn1acPHSAfz7Xhcc6DrTsIRhCpCWNPZukoXtT2mGjjqMWU7bqw1aXJcQVpLFngzT1rHHLru/Uw0b3PvI8DXt+ZHzYSAgTpLFngTT0rHPDru+rho0GT6NSrYZWlyVEhqSxB0iaevY4fdd30rDRi+xb/x3lqtfjubc+p+D19nwMoRAppLEHQJp69jl51/empTOYPaQrifGXZdhIOIo09kxIQw+eE3d9x5w7w+whXdmybBY3lb+fZv3GyLCRcJRg97G7ljR1M5y263vvumUMeb4K21bM5dF2/eg6eoU0deE4csWehjR0s5yy6/ty3EXmj3yDNbM+Sxo2+vArSt9Z2eqyhMgWaezJZCVA6Nh91/fBXT8zuW/rpGGjJl15rMMAGTYSjiaNHVkJ4FVJw0aDWTbuXQpcfwMdP15C2fv+bXVZQgTN841dbr140/E/9jK5bxsO79nEvY80pWHPoTJsJFzDs41dbr14k8/nY82sT/lm1JvkzpuP1u9Op+LDDawuSwijPNnY5daLN509HsXUgS+yf8MK7qpRn2d7fSbDRsKVPNXY5Srdu64YNnp9FNUbvCDDRsK1PNPY5Srdm1IPG5W5+wGa9htDkdLyfBjhbq5v7HKV7l17fvqW6W+3S3qyUfv+1GrRU55sJDzB1X/Kpal706XYGL4Z+QZrZn9O8ZvLybCR8BzXNna59eJNaYeN/tNxILny5LW6LCHCynWNXXLp3pSYEM/SMe+wfPx7MmwkPM9VjV2aujf9+fsepvRtw+G9m2XYSAhc0tiloXuTz+fjh1mfsGBUL3LnzSdPNhIimeMbuzR1b5JhIyEy5ujGLk3de7TWbF46g9nvdyMxIZ5n3viYak/9V4aNhEjFkY1dGro3xZw9zawhXdm6fDY3V6jG832/lGEjIdLhuMYuTd2b9vy0lGkD23Hhr5M81mEADzd/WYaNhMiAY/7NkIbuTZdiY5g/4nXWzhlN8ZvL0fajryl1RyWryxLC1oJq7EqpgcCTgA84AbTSWh81UVgKmR71rj92bmBK39acivqVfz3fjcc6DJBhIyECEOwV+/ta694ASqmuQB+gfdBVJZPpUW9KTEhg6ZhBLB//HgWLlKTjx0u4/d5/WV2WEI4RVGPXWp9P9WU+QAdXzt/k1ot3qRw5+H3rj1Sp14SGPYcSeW1Bq0sSwlGU1sH1YqXUIKAFcA74t9b6ZAavawu0Tf6yPLAzqDe2t+uBU1YXEUJuPj83nxvI+TndHVrr/P5e5LexK6WWA8XT+Vu9tNbzUr3uDSCv1rqv3zdVaqPW+l5/r3MqOT/ncvO5gZyf0wV6fn5vxWitawf4nlOBhYDfxi6EECJ0cgTzw0qp21N9+QSwN7hyhBBCBCvYVMy7Sqk7SIo7HiTwRMzoIN/X7uT8nMvN5wZyfk4X0PkF/eGpEEIIewnqVowQQgj7kcYuhBAuY1ljV0oNVEptV0ptVUp9q5S6wapaTFNKva+U2pt8fnOVUq56nI9SqrFSapdSyqeUck20TClVXym1Tyn1i1LqdavrMUkpNVYpdUIp5cr5EaVUaaXUSqXUnuQ/m92srskUpVRepdQGpdS25HPr7/dnrLrHrpQqkDK5mryO4C6ttbF1BFZSStUFVmitE5RS7wForV+zuCxjlFLlSPrA/HOgp9Z6o8UlBU0pFQHsB+oAUcDPQBOt9W5LCzNEKfUQcAGYqLUub3U9pimlSgAltNablVL5gU3AU27456eSHjaQT2t9QSmVC1gDdNNar8voZyy7Yg/lOgKraa2/1VonJH+5DihlZT2maa33aK33WV2HYVWBX7TWv2mtLwPTSVpw5wpa69XAGavrCBWt9TGt9ebk/x0N7AFKWluVGTrJheQvcyX/lWm/tPQeu1JqkFLqMNCUpAVibtQGWGx1EcKvksDhVF9H4ZLG4DVKqTJAZWC9tZWYo5SKUEptJWmL7jKtdabnFtLGrpRarpTamc5fTwJorXtprUsDU4DOoazFNH/nlvyaXkACSefnKIGcn8uk92w91/xXpFcopa4F5gDd09wVcDStdaLWuhJJ//VfVSmV6e20kD5ow83rCPydm1KqJfAfoJZ24LBAFv7ZuUUUUDrV16UAo88WEKGVfP95DjBFa/2V1fWEgtb6rFJqFVCfTBYpWpmKce06AqVUfeA14Amt9UWr6xEB+Rm4XSl1s1IqN/AcMN/imkSAkj9gHAPs0VoPtboek5RSRVKSdUqpSKA2fvqllamYOcAV6wi01kcsKcYwpdQvQB7gdPK31rkl8QOglGoAjASKAGeBrVrretZWFTyl1KPAMCACGKu1HmRxScYopaYB/yJpre1xoK/WeoylRRmklKoJ/ADsIKmnALyptV5kXVVmKKUqABNI+nOZA5iptR6Q6c848C6BEEKITMjkqRBCuIw0diGEcBlp7EII4TLS2IUQwmWksQshhMtIYxdCCJeRxi6EEC7z/x3xiFgXcTeMAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_svc_decision_boundary(svc_soft, axis=[-3, 3, -3, 3])\n",
    "plt.scatter(X_standard[y==0,0], X_standard[y==0,1])\n",
    "plt.scatter(X_standard[y==1,0], X_standard[y==1,1])\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
